package controllers

import (
	"backend/constants/errorCode"
	"backend/utils"
	"github.com/beego/beego/v2/adapter/logs"
	"github.com/beego/beego/v2/core/validation"
	beego "github.com/beego/beego/v2/server/web"
)


type FileController struct {
	beego.Controller
}


// URLMapping ...
func (c *FileController) URLMapping() {
	c.Mapping("CreateFile", c.CreateFile)
}


// CreateFile
// @Title 创建文件
// @Description 创建文件
// @Param	path		string 	true		"路径"
// @Success 0
// @Failure 404
// @router /createFile [post]
func (c *FileController)CreateFile(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	valid.Required(path, "path")
	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		err := utils.CreateFile(path)
		if err != nil {
			result = errorCode.ErrServer.SetMsg(err.Error())
		}else{
			result = errorCode.OK
		}
	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}

// CreateDir
// @Title 创建文件夹
// @Description 创建文件夹
// @Param	path		string 	true		"路径"
// @Success 0
// @Failure 404
// @router /createDir [post]
func (c *FileController)CreateDir(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	valid.Required(path, "path")
	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		err := utils.CreateDir(path)
		if err != nil {
			result = errorCode.ErrServer.SetMsg(err.Error())
		}else{
			result = errorCode.OK
		}
	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}

// Remove
// @Title 删除文件或者文件夹
// @Description 删除文件或者文件夹
// @Param	path		string 	true		"路径"
// @Success 0
// @Failure 404
// @router /remove [post]
func (c *FileController)Remove(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	valid.Required(path, "path")
	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		if utils.IsExistFile(path){
		err := utils.RemoveDirOrFile(path)
		if err != nil {
			result = errorCode.ErrServer.SetMsg(err.Error())
		}else{
			result = errorCode.OK
		}}else{
			result = errorCode.ErrServer.SetMsg("该文件不存在")
		}
	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}

// Read
// @Title 读文件
// @Description 读文件
// @Param	path		string 	true		"根目录"
// @Success 0
// @Failure 404
// @router /read [post]
func (c *FileController)Read(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	valid.Required(path, "path")
	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		if utils.IsExistFile(path){
			content,err := utils.ReadFile(path)
			if err != nil {
				result = errorCode.ErrServer.SetMsg(err.Error())
			}else{
				data := make(map[string]interface{})
				data["content"] = content
				result = errorCode.OK.WithData(data)
			}
		}else{
			result = errorCode.ErrServer.SetMsg("该文件不存在")
		}

	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}

// Write
// @Title 写文件
// @Description 写文件
// @Param	path		string 	true		"根目录"
// @Param	content		string 	true		"根目录"
// @Success 0
// @Failure 404
// @router /write [post]
func (c *FileController)Write(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	content := c.Ctx.Input.Query("content")
	valid.Required(path, "path")
	valid.Required(content, "content")
	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		if utils.IsExistFile(path){
			err := utils.WriteFile(path,content)
			if err != nil {
				result = errorCode.ErrServer.SetMsg(err.Error())
			}else{
				data := make(map[string]interface{})
				data["content"] = content
				result = errorCode.OK.WithData(data)
			}
		}else{
			result = errorCode.ErrServer.SetMsg("该文件不存在")
		}
	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}


// Rename
// @Title 重命名目录或者文件
// @Description 重命名目录或者文件
// @Param	path		string 	true		"根目录"
// @Param	old_name		string 	true		"旧名称"
// @Param	new_name		string 	true		"新名称"
// @Success 0
// @Failure 404
// @router /rename [post]
func (c *FileController)Rename(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	oldName := c.Ctx.Input.Query("old_name")
	newName := c.Ctx.Input.Query("new_name")

	valid.Required(path, "path")
	valid.Required(oldName, "old_name")
	valid.Required(newName, "new_name")

	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		if utils.IsExistFile(path){
			err := utils.RenameFile(path,oldName,newName)
			if err != nil {
				result = errorCode.ErrServer.SetMsg(err.Error())
			}else{
				result = errorCode.OK
			}
		}else{
			result = errorCode.ErrServer.SetMsg("文件所在目录不存在")
		}
	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}

// List
// @Title 获取文件或者文件夹
// @Description 获取文件或者文件夹
// @Param	path		string 	true		"根目录"
// @Success 0
// @Failure 404
// @router /list [post]
func (c *FileController)List(){
	var result interface{}
	valid := validation.Validation{}
	path := c.Ctx.Input.Query("path")
	valid.Required(path, "path")
	if valid.HasErrors() {
		// 如果有错误信息，证明验证没通过
		// 打印错误信息
		var msg string
		for _, err := range valid.Errors {
			msg = err.Key + err.Message
		}
		result = errorCode.ErrParam.SetMsg(msg)
	}else{
		data,err := utils.ListDir(path,"")
		if err != nil {
			result = errorCode.ErrServer.SetMsg(err.Error())
		}else{
			result = errorCode.OK.WithData(data)
		}
	}
	c.Data["json"] = result
	err := c.ServeJSON()
	if err != nil {
		logs.Error(err.Error())
		return
	}
}